Data Analytics
Project Template

y-sako

June 10, 2023

Who ?

Yuya Katsurasako

  Data Scientist

  • 某マーケティングリサーチ会社
  • 広告効果推定のモデル&Sol開発

  Marketing Science

  • 消費者行動の統計モデリング
  • Market Response, Brand Choice,…

  R歴は5~6年くらい

  • R(Stan), Python, SQL
  • Quarto, Shiny, Streamlit

What ?

今日話すこと

  • データ分析のプロジェクトテンプレを作ってみた
  • (ので、一旦晒してみるといったところ)
  • なぜ作ったのか, 使い方や中身の解説, …

今日話さないこと

  • AWS, Docker, Git, Quarto, Shiny, Streamlit,…
  • 基本的な概念, 操作方法

Why ?

一般的な分析ワークフロー

現実は厳しい

  • (ビジネスの)データ分析は"つらいこと"がたくさん
  • その中でも"技術的に解決出来る部分"は少しずつでも解消   とにかく楽をしたい
  • 分析以外の手間を省けるようにテンプレートとして共有

(現場のDSにヒアリング)

環境の構築

  • 分析案件は小規模 & 多岐に渡る
  • とは言え、バラバラの環境だと困る
    • 正直よく分からん、ノリ

結果の共有

  • 分析結果を切り貼り
  • また資料作成し直しか、、
    • 分析作業よりそれ以外の時間が長い

当然Pythonも使いたい

  • RもShinyもよく分からん
  • 出来ればStreamlitとかが良い
    • R(reticlurate)じゃダメか?

エディタはxxx派

  • Jupyterlabが良い
  • VSCodeが良い
    • RStudioじゃダメか?

OK!!

作ってみた

GitHub https://github.com/y-sako?tab=repositories


コンセプト

  • 環境構築はなるべくシンプルに(知識が無くても汎用的に)

  • 結果共有はhtmlレポートやwebアプリでクイックに(組織内には)

  • 言語やエディタは好きなもので!(みんな仲良く)

How ?

使い方は簡単

  1. テンプレリポジトリをワークスペースに(オンプレ / クラウド)

  2. 環境構築はdocker-compose upするだけ(+ .envファイルで設定)

  3. 分析作業はQuartoメインで(RもPythonも書けるよ、使ってみない?)

  4. 結果共有はShiny & Streamlit(shareディレクトリにファイルを置くだけ)

# テンプレリポジトリを用意
$ git clone ~

# 環境構築ディレクトリへ
$ cd project/.docker

# .envファイルを作成(詳細は後述)
$ touch .env

# コンテナを作成
$ docker-compose up -d

おわり

おわり  もう少し解説

テンプレ

ディレクトリ構成

  • 一般的な分析プロジェクトを想定

  • (あくまで参考に)

 project
    
    ├── .github/           <- Gitの設定用
    
    ├── .vscode/           <- VSCodeの設定用
    
    ├── .docker/           <- 環境構築用ファイル
    
    ├── data/              <- データ用
    
    ├── eda/               <- 探索的分析用
    
    ├── model/             <- モデリング用(モデルオブジェクトなど)
    
    ├── output/            <- アウトプット用
    
    ├── script/            <- ソースコード用
    
    ├── share/             <- 結果共有用(htmlレポートやappを配置)
    
    ├── .dockerignore
    
    ├── .gitignore
    
    ├── project.Rproj    
    
    ├── project.qmd        <- メインファイル
    
    └── README.md          <- プロジェクトの説明用
    

環境構築①

Dockerfile

  • rockerベースに日本語設定、必要な言語 / ライブラリ / フレームワークを入れていく

  • (使わないものは省略 / renvpoetryでカチッとやる場合も)

# ベースイメージ
FROM rocker/verse:4.3.0

# OS環境設定
## ロケール
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
RUN sed -i '$d' /etc/locale.gen \
      && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
      && locale-gen ja_JP.UTF-8 \
      && /usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
RUN /bin/bash -c "source /etc/default/locale"
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
## フォント
RUN apt-get update && apt-get install -y \
      fonts-ipaexfont \
      fonts-noto-cjk \
      fonts-firacode

# パッケージのインストール
## 汎用
RUN install2.r --error --deps TRUE --ncpus -1 \
      languageserver \
      pacman \
      rmdformats \
      systemfonts \
      janitor \
      data.table \
      progress \
      RVerbalExpressions \
      png \
      reticulate \
      markdown \
      svglite \
      DT \
      gt \
      gtExtras \
      plotly \
      zipangu
      
## モデリング用
RUN install2.r --error --ncpus -1\
      performance \
      parameters \
      see \
      rstan \
      tidybayes \
      brms \
      Robyn

# Quartoのインストール
RUN sudo rm -rf /opt/quarto
ENV QUARTO_VERSION 1.3.361
RUN /rocker_scripts/install_quarto.sh
RUN quarto install extension quarto-ext/fontawesome  --no-prompt

# Shinyのインストール
# ENV SHINY_SERVER_VERSION 1.5.20.1002
RUN /rocker_scripts/install_shiny_server.sh
RUN install2.r --error --ncpus -1\
      flexdashboard \
      bs4Dash \
      bslib \
      thematic \
      shinyWidgets 

# Pythonのインストール
RUN apt-get update && apt-get install -y python3 python3-pip

# ライブラリのインストール
## 汎用
RUN pip install -U pip \
      && pip install --no-cache-dir jupyter \
      && pip install --no-cache-dir jupyterlab \
      && pip install --no-cache-dir pandas \
      && pip install --no-cache-dir numpy \
      && pip install --no-cache-dir streamlit \
      && pip install --no-cache-dir shiny \
      && pip install --no-cache-dir lightweight_mmm

環境構築②

docker-compose.yml

  • RStudio & Shiny & Jupyterlab & Streamlit Serverをサービスとして用意

  • (プロジェクトで異なる部分は変数 & 共通する部分はファイルや設定をマウント)

version: '3'

services:
  quarto:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    image: "${COMPOSE_PROJECT_NAME}"
    container_name: "${COMPOSE_PROJECT_NAME}"
    ports:
      - "${PORT_NUM_RSTUDIO}:8787"
      - "${PORT_NUM_SHINY}:3838"
    environment:
      - ROOT=TRUE
      - "PASSWORD=${PASSWORD}"
      - DISABLE_AUTH=false
      - ADD=shiny
    volumes:
      - ../:/home/rstudio/project
      - ../.rstudio/rstudio-prefs.json:/home/rstudio/.config/rstudio/rstudio-prefs.json
      - ../:/home/vscode/project
      - ../share/shiny:/srv/shiny-server
      - "${PATH_DATA}:/home/rstudio/project/data"
      - "${PATH_DATA}:/home/vscode/project/data"
    tty: true
    stdin_open: true

  jupyterlab:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    image: "${COMPOSE_PROJECT_NAME}_jupyterlab"
    container_name: "${COMPOSE_PROJECT_NAME}_jupyterlab"     
    working_dir: /home/jupyterlab/project
    tty: true
    volumes:
      - ../:/home/jupyterlab/project
      - "${PATH_DATA}:/home/jupyterlab/project/data"
    ports: 
      - "${PORT_NUM_JUPYTERLAB}:8080"
    environment:
      - "JUPYTER_PASS=${PASSWORD}"
    command: "jupyter-lab --ip 0.0.0.0 --port=8080 --allow-root --no-browser --NotebookApp.token=''"

  streamlit:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    image: "${COMPOSE_PROJECT_NAME}_streamlit"
    container_name: "${COMPOSE_PROJECT_NAME}_streamlit"       
    working_dir: /home/streamlit/project
    tty: true
    volumes: 
      - ../:/home/streamlit/project
      - "${PATH_DATA}:/home/streamlit/project/data"
    ports: 
      - "${PORT_NUM_STREAMLIT}:8501"
    command: streamlit run ./share/streamlit/app.py

環境構築③

.env

  • docker-compose.yml内に渡す環境変数を定義、各自で作成

  • (git管理外にして環境構築用ファイルを使いまわせるように)

# プロジェクト名
COMPOSE_PROJECT_NAME=proj_tokyor

# データパス(e.g. ファイルサーバーをマウント)
PATH_DATA=/data

# ポート番号を指定(e.g. 空きポートを使用)
PORT_NUM_RSTUDIO=8001
PORT_NUM_SHINY=8002
PORT_NUM_JUPYTERLAB=8003
PORT_NUM_STREAMLIT=8004

# RStudioとJupyterlabのパスワード
PASSWORD=20230610

やってみる

分析作業

自分の場合

  • RはRStudioで(ブラウザから)

  • PythonはVSCodeで(コンテナにリモート接続)

  • Quartoメイン(engine切り替え)

RStudio

Jupyterlab

結果共有

展開も楽に

  • Shiny & Streamlitを活用

  • shareディレクトリ配下にファイルを置くだけで更新

Shiny-server

Streamlit-server

やってみる

おわりに

まだまだ試行錯誤中

  • チームメンバーからのFBで少しずつ改善

  • もっと良い方法あるよ!など大歓迎

個人のAWS環境で公開

  • そのうち停止するのでスライドなどの資料はどこかに移行

  • (テンプレはセキュアな環境での使用を推奨)

余談:Quartoでスライド作るのはほぼ初めて

Enjoy!!


y-sako/xxxxx